{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Unbalanced power flow calculation with pandapower\n",
    "\n",
    "We will create a simple three bus system to demonstrate how to run unbalanced power flow calculations with pandapower. First, we create the three buses as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:37.527555Z",
     "start_time": "2025-10-20T13:17:32.781114Z"
    }
   },
   "outputs": [],
   "source": [
    "from pandapower.create import (\n",
    "    create_empty_network,\n",
    "    create_bus,\n",
    "    create_ext_grid,\n",
    "    create_transformer_from_parameters,\n",
    "    create_line_from_parameters,\n",
    "    create_asymmetric_load\n",
    ")\n",
    "from pandapower.pf.runpp_3ph import runpp_3ph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:37.796734Z",
     "start_time": "2025-10-20T13:17:37.534560Z"
    }
   },
   "outputs": [],
   "source": [
    "net = create_empty_network()\n",
    "b1  = create_bus(net, 20.0)\n",
    "b2  = create_bus(net, 0.4)\n",
    "b3  = create_bus(net, 0.4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The external grid connection can then be created with the short-circuit parameters s_sc_max_mva and rx_max as well as the parameters x0x_max and r0x0_max that define the zero sequence impedances. The ext_grid parameters are all defined in the [ext_grid parameter documentation](https://pandapower.readthedocs.io/en/develop/elements/ext_grid.html#input-parameters)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:37.828635Z",
     "start_time": "2025-10-20T13:17:37.805736Z"
    }
   },
   "outputs": [],
   "source": [
    "create_ext_grid(net, b1, s_sc_max_mva=1000, rx_max=0.1, x0x_max=1.0,\n",
    "                   r0x0_max=0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The transformer requires the additional parameters vk0_percent, vkr0_percent, mag0_percent, mag0_rx, vector_group and si0_hv_partial for unbalanced calculation. The transformer parameters are all defined in the [transformer parameter documentation](https://pandapower.readthedocs.io/en/develop/elements/trafo.html#input-parameters)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:37.891114Z",
     "start_time": "2025-10-20T13:17:37.871755Z"
    }
   },
   "outputs": [],
   "source": [
    "create_transformer_from_parameters(net, b1, b2, sn_mva=0.63,\n",
    "                                      vn_hv_kv=20., vn_lv_kv=0.4,\n",
    "                                      vkr_percent=0.1, vk_percent=6,\n",
    "                                      vk0_percent=6, vkr0_percent=0.78125,\n",
    "                                      mag0_percent=100, mag0_rx=0.,\n",
    "                                      pfe_kw=0.1, i0_percent=0.1,\n",
    "                                      vector_group=\"Dyn\", shift_degree=150,\n",
    "                                      si0_hv_partial=0.9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For lines, the zero sequence impedances r0_ohm_per_km, x0_ohm_per_km and c0_nf_per_km are required in addition to the balanced parameters. The line parameters are all defined in the [line parameter documentation](https://pandapower.readthedocs.io/en/develop/elements/line.html#input-parameters)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:38.029198Z",
     "start_time": "2025-10-20T13:17:38.000817Z"
    }
   },
   "outputs": [],
   "source": [
    "create_line_from_parameters(net, b2, b3, length_km=0.1, r0_ohm_per_km=0.0848,\n",
    "                               x0_ohm_per_km=0.4649556, c0_nf_per_km=230.6,\n",
    "                               max_i_ka=0.963, r_ohm_per_km=0.0212,\n",
    "                               x_ohm_per_km=0.1162389, c_nf_per_km= 230)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, to create an unbalanced power flow, we create an asymmetric load. The input parameters are all defined in the [asymmetric load parameter documentation](https://pandapower.readthedocs.io/en/develop/elements/asymmetric_load.html#input-parameters)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:38.139021Z",
     "start_time": "2025-10-20T13:17:38.119011Z"
    }
   },
   "outputs": [],
   "source": [
    "create_asymmetric_load(net, b3, p_a_mw=0.25, p_b_mw=0.18, p_c_mw=0.20, type=\"wye\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now run an unbalanced power flow:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:42.071055Z",
     "start_time": "2025-10-20T13:17:38.227581Z"
    }
   },
   "outputs": [],
   "source": [
    "runpp_3ph(net)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The results are stored in the result tables with suffix \"_3ph\", such as \"res_bus_3ph\", \"res_line_3ph\" etc.:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:42.102646Z",
     "start_time": "2025-10-20T13:17:42.078065Z"
    }
   },
   "outputs": [],
   "source": [
    "net.res_bus_3ph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can check the voltage in all phases as well as the unbalance percentage according to IEC 62749:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:42.493893Z",
     "start_time": "2025-10-20T13:17:42.469897Z"
    }
   },
   "outputs": [],
   "source": [
    "net.res_bus_3ph[[\"vm_a_pu\", \"vm_b_pu\", \"vm_c_pu\", \"unbalance_percent\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The line and trafo results provide currents and loadings in different phases or overall loading, which is defined as the maximum of all phase loadings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:43.038838Z",
     "start_time": "2025-10-20T13:17:43.013829Z"
    }
   },
   "outputs": [],
   "source": [
    "net.res_line_3ph[[\"i_a_from_ka\", \"i_b_to_ka\", \"loading_b_percent\", \"loading_percent\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T13:17:43.258103Z",
     "start_time": "2025-10-20T13:17:43.230386Z"
    }
   },
   "outputs": [],
   "source": [
    "net.res_trafo_3ph[[\"i_a_hv_ka\", \"i_b_lv_ka\", \"loading_b_percent\", \"loading_percent\"]]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
